﻿using Kanban.Business;
using Kanban.Entity;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Web.Http;

namespace Kanban.Api.Controllers
{
    public class EquipesController : ApiController
    {
        [Authorize]
        public List<Equipe> Get()
        {
            var businessEquipe = new EquipeBusiness();
            var businessUsuario = new UsuarioBusiness();

            List<Equipe> equipes = businessEquipe.ListarPorUsuario(User.Identity.Name);

            if (equipes != null)
            {
                foreach (Equipe equipe in equipes)
                {
                    equipe.Usuarios = businessUsuario.ListarPorEquipe(equipe.Id);
                }
            }

            return equipes;
        }

        [Authorize]
        public Equipe Get(int id)
        {
            var business = new EquipeBusiness();
            Equipe equipe = business.ObterPorId(id);
            return equipe;
        }


        // UPDATE
        [Authorize]
        public Equipe Put(Equipe equipe)
        {
            var business = new EquipeBusiness();
            business.Atualizar(equipe);
            return equipe;
        }

        // INSERT
        [Authorize]
        public Equipe Post([FromUri]int id, [FromBody]Usuario usuario)
        {
            var equipeBusiness = new EquipeBusiness();

            var equipe = equipeBusiness.ObterPorId(id);

            if (equipe == null)
            {
                throw new Exception(string.Format("A equipe {0} não existe.", id));
            }

            var usuarioBusiness = new UsuarioBusiness();
            List<Usuario> listaUsuarios = usuarioBusiness.ListarPorEquipe(id); ;
            if (listaUsuarios != null)
            {
                foreach (Usuario u in listaUsuarios)
                {
                    if (u.Nome == usuario.Nome)
                    {
                        throw new Exception(string.Format("O usuário {0} já está cadastrado nessa equipe.", usuario.Nome));
                    }
                }
            }

            equipeBusiness.AdicionarUsuario(id, usuario);

            equipe.Usuarios = new List<Usuario>();
            equipe.Usuarios.Add(usuario);

            return equipe;
        }

        // INSERT
        [Authorize]
        public Equipe Post([FromBody]Equipe equipe)
        {            
            var usuarioBusiness = new UsuarioBusiness();
            equipe.CriadaPor = usuarioBusiness.ObterPorNome(User.Identity.Name);

            var equipeBusiness = new EquipeBusiness();
            equipeBusiness.Adicionar(equipe);
            return equipe;
        }

        [Authorize]
        public Equipe Delete(int id)
        {
            var business = new EquipeBusiness();
            var equipe = business.ObterPorId(id);            
            business.Excluir(equipe.Id);
            equipe.Excluido = true;
            return equipe;
        }

        [Authorize]
        [HttpDelete]
        public void RemoverUsuarios([FromUri]int idEquipe, [FromBody]IList<int> idUsuarios)
        {
            var business = new EquipeBusiness();
            foreach (int idUsuario in idUsuarios)
            {
                business.ExcluirUsuarioPorEquipe(idEquipe, idUsuario);
            }
        }
    }
}
